iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
佛心分享-IT 人自學之術

C++探險家系列 第 28

Day 28 記帳專題製作

  • 分享至 

  • xImage
  •  

會利用兩天的時間來製作這個記帳小專題,今天是第一部分!希望可以順利執行~

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <sstream>

#define MaxNum 256
using namespace std;

// 寫入資料到檔案
void writeToFile(int year, int month, int type, int amount) {
    ofstream myfile;
    myfile.open("data.txt", ios::out | ios::app); // 以附加方式寫入檔案
    if (!myfile.is_open()) {
        cout << "檔案開啟失敗" << endl;
        return;
    }
    // 將資料寫入檔案,以 < 作為分隔符
    myfile << year << "<" << month << "<" << type << "<" << amount << endl;
    myfile.close();
}

// 讀取檔案並根據年份與月份顯示資料
void readFile(int year, int month) {
    int readYear, readMonth, readType, readAmount;
    int record[8] = {0}; // 初始化記錄
    ifstream myfile("data.txt");

    if (!myfile.is_open()) {
        cout << "檔案開啟失敗" << endl;
        return;
    }

    string line;
    // 讀取每一行並解析
    while (getline(myfile, line)) {
        stringstream ss(line);
        char delimiter;
        ss >> readYear >> delimiter >> readMonth >> delimiter >> readType >> delimiter >> readAmount;

        if ((readYear == year && readMonth == month) || month == 0) {
            record[0] += readAmount; // 總金額
            record[readType] += readAmount; // 類型對應的金額
        }
    }

    // 顯示結果
    cout << "年份:" << year << " 月份:" << month << endl;
    if (record[0] == 0) {
        cout << "無此月份資料" << endl;
    } else {
        cout << "種類\t 金額\t 比例" << endl;
        cout << "=============================" << endl;
        cout << "總額\t" << record[0] << endl;
        cout << "食\t" << record[1] << "\t" << record[1] * 100 / record[0] << "%" << endl;
        cout << "衣\t" << record[2] << "\t" << record[2] * 100 / record[0] << "%" << endl;
        cout << "住\t" << record[3] << "\t" << record[3] * 100 / record[0] << "%" << endl;
        cout << "行\t" << record[4] << "\t" << record[4] * 100 / record[0] << "%" << endl;
        cout << "育\t" << record[5] << "\t" << record[5] * 100 / record[0] << "%" << endl;
        cout << "樂\t" << record[6] << "\t" << record[6] * 100 / record[0] << "%" << endl;
        cout << "其他\t" << record[7] << "\t" << record[7] * 100 / record[0] << "%" << endl;
    }

    myfile.close();
}

int main() {
    int temp;
    struct tm *local;
    time_t t;
    char* dt;

    // 假設這裡有些邏輯來取得當前時間或處理使用者輸入
    time(&t);
    local = localtime(&t);
    dt = ctime(&t);

    // 範例使用者操作
    int year = local->tm_year + 1900;
    int month = local->tm_mon + 1;
    writeToFile(year, month, 1, 500); // 寫入測試資料
    readFile(year, month); // 讀取並顯示資料

    return 0;
}

說明:記帳系統的基礎功能,裡面包含資料寫入與讀取。writeToFile() 函數接收年份、月份、類型及金額,並將這些資訊以附加方式寫入到 data.txt 檔案中,確保舊資料不會被覆蓋。readFile() 函數則會讀取該檔案,根據指定的年份與月份匯總各類型的金額,並計算各類別佔總額的比例。程式使用了 fstream 處理檔案讀寫,stringstream 解析檔案內容中的分隔符號 <,並以表格式顯示資料。主函數中使用系統時間作為範例輸入進行測試。以上是這一部分程式碼的解說!

!!以上內容是跟著第一次學C++就上手第二版一起跟著實作練習!!
今天也不知不覺來到了第28天,明天會繼續把這個小專案做完!希望一切順利囉,加油


上一篇
Day 27 書籍借還系統專題製作
下一篇
Day 29 記帳專題紀錄
系列文
C++探險家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言